home *** CD-ROM | disk | FTP | other *** search
- {
- MARCO MILTENBURG
-
- > Currently I'm writing a Program which must be able to handle multitask
- > evironments. But as I'm trying to Write a Record which is open in another
- > Window (of DesqView for instance) than a runtime error 5 appears. Seems
- > logical. But how do I 'lock' the Record, what are the attibutes, and what
- > must the Program do if it can't open a Record???
-
- Locking isn't that difficult... First of all, do you have to keep the
- File available For anybody else (in another task) or not. if not, use the
- Filesharing bits when you're opening the File. They are :
-
- bit 0-2 = 000 - read permission For your own appliction
- 001 - Write permission For you own application
- 010 - both read and Write permission For you own application
-
- bit 3 = 0 - Always zero!
-
- bit 4-6 = 000 - compatibilty mode. Share the File whenever possible.
- 001 - reading and writing not allowed For other applications
- 010 - writing not allowed For other applications (usefull when
- you're gonna read the File, so others can not update it)
- 011 - reading not allowed For other applications (usefull when
- you're gonna update the File and others may not read it).
- 100 - Full access For other applications (dangerous in my point of
- view!).
-
- bit 7 = 0 - Lower process owns File
- 1 - File only For current process.
-
- Set the bits to your needs and assign the value to FileMode before opening the
- File. For example, I want to read a File which must be locked completly. Is
- must use the value 00010000b which is $10. So use FileMode = $10 before opening
- the File. Please note that FileMode only take affect on Files which are
- declared as ': File' or ': File of ....'. It's not supported on ': Text' Files.
- if you want to lock these Files, use the next method.
-
- if you only want to lock a single Record of a File (or an entier File) you can
- use the following Function :
-
-
- Ooh BTW: This will only work With Dos 3.0+ (of course ;-) With SHARE loaded.
- }
-
- Function FileLocking(Action : Byte;
- Handle : Word;
- Start, end : LongInt) : Boolean;
- Var
- Regs : Registers;
- begin
- Regs.AH := $5C;
- Regs.AL := Action;
- Regs.BX := Handle;
- Regs.CX := Hi(Start);
- Regs.DX := Lo(Start);
- Regs.DI := Lo(end);
- Regs.SI := Hi(end);
- Intr($21, Regs);
- FileLocking := ((Regs.FLAGS and $01) = 0);
- end;
-
- {
- Use For Action '0' to lock or '1' to unlock the File. The funtion returns True
- when succesfull. The Handle Variable must contain the Filehandle, assigned by
- Dos. For TextFiles you can obtain this handle With :
-
- TextRec(T).Handle
-
- where T is the TextFile (declared With T : Text). I don't know how to obtain
- the Filehandle of another FileType at the moment. I will have to look For it.
- Start and end contain the starting and ending position (in Bytes) from what you
- want to lock (for Typed Files, they can easaly be calculated using FilePos and
- SizeOf(....Record) etc..). if you want to lock the entire File, use 0 For start
- and $FFFFFFFF For end. Locking beyond the end of the File doesn't result in an
- error!
- }